# CONFIGURACION
################

# Especifica los programas a compilar. El codigo fuente para cada uno
# debe ir en una carpeta que lleve el mismo nombre que el mismo.
PROGS = server client

# Si hay modulos comunes a todos los programas a compilar, se especifica
# la carpeta donde se encuentran. 
COMMON = common

# Especifica la carpeta donde se debe almacenar todo el codigo objeto una vez
# compilado el fuente. No es necesario que la carpeta exista, se crea antes
# de compilar.
OBJ_DIR = ./obj

# Si usa funciones de math.h, descomentá (quitale el '#' a) la siguiente línea.
#math = si

# Si usa pthreads, descomentá (quitale el '#' a) la siguiente línea.
pthreads = si

# Si es un programa gtkmm, descomentá (quitale el '#' a) la siguiente línea.
#gtkmm = si

# Descomentar si se quiere ver como se invoca al compilador
#verbose = si

# CONFIGURACION "AVANZADA"
###########################

# Opciones para el compilador en modo ansi.
CXXFLAGS = -Wall -pedantic -pedantic-errors

# Para que explote lo mas posible
CXXFLAGS += -O3 -DNDEBUG

# Para valgrind o debug
CXXFLAGS += -ggdb -DDEBUG -fno-inline

# Opciones del enlazador.
LDFLAGS =

# Estandar de C++ a usar
CXXSTD = c++98

# Si se quiere compilar estaticamente, descomentar la siguiente linea
#static = si

# VARIABLES CALCULADAS A PARTIR DE LA CONFIGURACION
####################################################

# Agrego flags y libs de gtkmm de ser necesario.
ifdef gtkmm
CFLAGS += $(shell pkg-config --cflags gtkmm-2.4)
LDFLAGS += $(shell pkg-config --libs gtkmm-2.4)
endif

# Linkeo con libm de ser necesario.
ifdef math
LDFLAGS += -lm
endif

# Linkeo con pthreads de ser necesario.
ifdef pthreads
LDFLAGS += -lpthread -pthread
endif

ifdef static
LDFLAGS += -static
endif

CXXFLAGS += -std=$(CXXSTD)
LD = $(CXX)


VALGRIND = valgrind --leak-check=full --show-reachable=yes  --track-origins=yes

define make_obj
$(OBJ_DIR)/$(1)/%.o: ./$(1)/%.cpp
	$(LD) $(CXXFLAGS) -c $$< -o $$@
endef

define link_prog
$(1)1: $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(wildcard $(1)/*.cpp) $(wildcard $(COMMON)/*.cpp))
	$(LD) $(LDFLAGS) $$^ $(LOADLIBES) $(LDLIBS) -o $$@ $(LDADD)
endef

all: checkdirs $(foreach prog,$(PROGS),$(prog)1)

$(foreach sdir,$(PROGS),$(eval $(call make_obj,$(sdir))))
$(eval $(call make_obj,$(COMMON)))

$(foreach prog,$(PROGS),$(eval $(call link_prog,$(prog))))

checkdirs: $(OBJ_DIR)

$(OBJ_DIR):
	@mkdir -p $@
	@mkdir -p $@/$(COMMON)
	$(foreach prog,$(PROGS),@mkdir -p $@/$(prog))
	@rm -rf @mkdir

clean:
	@rm -rf obj $(foreach prog,$(PROGS),$(prog)1)
